/* Copyright (c) Microsoft Corporation.
   Licensed under the MIT License. */

/***************************************************************************

	ape.h: Actor preview entity

	Primary Author: ******
	Review Status: REVIEWED - any changes to this file must be reviewed!

	BASE ---> CMH ---> GOB ---> APE

***************************************************************************/
#ifndef APE_H
#define APE_H

// APE tool types
enum
	{
	aptNil = 0,
	aptIncCmtl,			// Increment CMTL
	aptIncAccessory,	// Increment Accessory
	aptGms,				// Material (MTRL or CMTL)
	aptLim
	};

// Generic material spec
struct GMS 
	{
	bool fValid; // if fFalse, ignore this GMS
	bool fMtrl;	// if fMtrl is fTrue, tagMtrl is valid.  Else cmid is valid
	long cmid;
	TAG tagMtrl;
	};

// Actor preview entity tool
struct APET
	{
	long apt;
	GMS gms;
	};


/****************************************
	Actor preview entity class
****************************************/
typedef class APE *PAPE;
#define APE_PAR GOB
#define kclsAPE 'APE'
class APE : public APE_PAR
	{
	RTCLASS_DEC
	ASSERT
	MARKMEM
	CMD_MAP_DEC(APE)

protected:
	PBWLD _pbwld;	// BRender world to draw actor in
	PTMPL _ptmpl;	// Template (or TDT) of the actor being previewed
	PBODY _pbody;	// Body of the actor being previewed
	APET _apet;		// Currently selected tool
	PGL _pglgms;	// What materials are attached to what body part sets
	long _celn;		// Current cel of action
	CLOK _clok;		// To time cel cycling
	BLIT _blit;		// BRender light data
	BACT _bact;		// BRender light actor
	long _anid;		// Current action ID
	long _iview;	// Current camera view
	bool _fCycleCels;// If cycling cels
	PRCA _prca;		// resource source (for cursors)
	long _ibsetOnlyAcc; // ibset of accessory, if only one (else ivNil)

protected:
	APE(PGCB pgcb) : GOB(pgcb), _clok(CMH::HidUnique()) {}
	bool _FInit(PTMPL ptmpl, PCOST pcost, long anid, bool fCycleCels, 
		PRCA prca);
	void _InitView(void);
	void _SetScale(void);
	void _UpdateView(void);
	bool _FApplyGms(GMS *pgms, long ibset);
	bool _FIncCmtl(GMS *pgms, long ibset, bool fNextAccessory);
	long _CmidNext(long ibset, long icmidCur, bool fNextAccessory);

public:
	static PAPE PapeNew(PGCB pgcb, PTMPL ptmpl, PCOST pcost, long anid, 
		bool fCycleCels, PRCA prca = pvNil);
	~APE();

	void SetToolMtrl(PTAG ptagMtrl);
	void SetToolCmtl(long cmid);
	void SetToolIncCmtl(void);
	void SetToolIncAccessory(void);

	bool FSetAction(long anid);
	bool FCmdNextCel(PCMD pcmd);

	void SetCustomView(BRA xa, BRA ya, BRA za);
	void ChangeView(void);
	virtual void Draw(PGNV pgnv, RC *prcClip);
	virtual bool FCmdMouseMove(PCMD_MOUSE pcmd);
	virtual bool FCmdTrackMouse(PCMD_MOUSE pcmd);

	bool FChangeTdt(PSTN pstn, long tdts, PTAG ptagTdf);
	bool FSetTdtMtrl(PTAG ptagMtrl);
	bool FGetTdtMtrlCno(CNO *pcno);

	void GetTdtInfo(PSTN pstn, long *ptdts, PTAG ptagTdf);
	long Anid(void) { return _anid; }
	long Celn(void) { return _celn; }
	void SetCycleCels(bool fOn);
	bool FIsCycleCels(void) { return _fCycleCels; }
	bool FDisplayCel(long celn);
	long Cbset(void) { return _pbody->Cbset(); }

	// Returns fTrue if a material was applied to this ibset
	bool FGetMaterial(long ibset, bool *pfMtrl, long *pcmid, TAG *ptagMtrl);
	};


#endif APE_H
